package com.starpl.mobile.android.monthunsae.november.common;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.ImageView;

import com.starpl.mobile.android.monthunsae.november.R;
import com.starpl.mobile.android.monthunsae.november.activity.HomeActivity;
import com.starpl.mobile.android.monthunsae.november.activity.JoinExtraActivity;
import com.starpl.mobile.android.monthunsae.november.activity.LoginActivity;
import com.starpl.mobile.android.monthunsae.november.activity.SplashScreenActivity;
import com.starpl.mobile.android.monthunsae.november.command.MonthUnsaeCommand;
import com.starpl.mobile.android.monthunsae.november.domain.UserInfo;
import com.starpl.mobile.android.platform.common.SharedUtil;
import com.starpl.mobile.android.platform.common.base.BaseApplication;
import com.starpl.mobile.android.platform.common.network.HttpHandler;
import com.starpl.mobile.android.platform.common.network.MsgException;

/**
 * 런처 클래스
 * 
 * @author 우연화
 * @since 2011.11.15
 */
public class Launcher
{
	private static final String TAG = "Launcher";
	
	// 스플래시 스크린(로딩 이미지) 유지 시간 - 단위 : 밀리초
	private static final int SPLASH_DISPLAY_LENGTH = 2000;
	private static final int[] SPLASH_DISPLAY_IMAGES = {R.drawable.img_starpl, R.drawable.img_loading};
	
	private static int mSplashIndex;
	
	/**
	 * 클라이언트 호스트로 애플리케이션을 실행한다.
	 * 
	 * @param activity
	 */
	public static void startClient(final SplashScreenActivity activity)
	{
		// 순서에 맞는 배경 이미지를 등록한다.
		mSplashIndex = 0;
		
		final ImageView ivLoading = (ImageView) activity.findViewById(R.id.splash_screen_activity_iv_loading);
		
		ivLoading.setBackgroundResource(SPLASH_DISPLAY_IMAGES[mSplashIndex]);
		
		// 딜레이를 주어 실행을 지연시키는 핸들러를 구현한다.
		new Handler().postDelayed(new Runnable()
		{
            @Override
            public void run()
            {
            	// 아직 남아있는 스플래시 스크린이 있을경우 해당 스크린을 보여준다.
            	if(++mSplashIndex < SPLASH_DISPLAY_IMAGES.length)
            	{
            		// 다음의 인덱스로 변경한다.
            		ivLoading.setBackgroundResource(SPLASH_DISPLAY_IMAGES[mSplashIndex]);
            		new Handler().postDelayed(this, SPLASH_DISPLAY_LENGTH);
            		return;
            	}
            	
            	// 자동 로그인 설정이 되어있을 경우
            	if(getSharedPreference().getBooleanSharedPreference("autoLogin"))
            	{
            		final String userId = getSharedPreference().getSharedPreference("autoLoginUserId");
					final String password = getSharedPreference().getSharedPreference("autoLoginUserPw");
					
					// 사용자 로그인
					MonthUnsaeCommand.login(new HttpHandler(activity, "로그인중입니다.")
					{
						@Override
						public void didStart()
						{
            				// 기존의 세션을 삭제한다.
                    		BaseApplication.clearSessionKey();
						}
						
						@Override
						public void didSucceed(Object result)
						{
							JSONObject object;
							try
							{
								object = ((JSONObject) result).getJSONObject("data");
								
								UserInfo userInfo = new UserInfo(object);
								
								// 생일정보가 없는 경우는 신비운 정보가 없다고 판단한다.
								if(userInfo.getBirthDate()==null)
								{
									Bundle extras = new Bundle();
									
									extras.putBoolean("isExtra", true);
									
									// 추가정보입력 페이지로 이동
									activity.getNewActivity()
										.setTargetActivity(JoinExtraActivity.class)
										.setRemoveTask()
										.setBundle(extras)
										.show();
								}
								// 생일정보가 있는 경우 바로 로그인을 시킨다.
								else
								{
									// 사용자 정보를 저장
									BaseApplication.setGlobalPersistent("userInfo", userInfo);
									
									// 홈 엑티비티로 이동
									activity.getNewActivity()
										.setRemoveTask()
										.setTargetActivity(HomeActivity.class)
										.show();
									
									// 현재 엑티비티를 종료
									activity.finish();
								}
							}
							catch(JSONException e)
							{
								Log.e(TAG, e.getMessage());
							}
						}

						@Override
						public void didError(MsgException error)
						{
							// 에러 발생시 로그인 페이지로 이동시킴
							String appsName = BaseApplication.getConfigPersistent("appsName");
							new AlertDialog.Builder(activity)
							.setTitle(appsName)
							.setMessage(error.getMessage())
							.setPositiveButton("확인", new OnClickListener()
							{
								@Override
								public void onClick(DialogInterface dialog, int which)
								{
									dialog.dismiss();
									
									activity.getNewActivity()
										.setRemoveTask()
										.setTargetActivity(LoginActivity.class)
										.show();
									activity.finish();
								}
							})
							.show();
						}
					}, activity, userId, password);
            	}
            	// 자동 로그인 설정이 안되어있을 경우
            	else
            	{
            		activity.getNewActivity()
            			.setRemoveTask()
            			.setTargetActivity(LoginActivity.class)
            			.show();
            		activity.finish();
            	}
            	
            }
		}, SPLASH_DISPLAY_LENGTH);
	}
	
	/**
	 * 테스트 버전으로 애플리케이션을 실행한다.
	 * 호스트 IP를 선택할 수 있다.
	 * 
	 * @param activity
	 */
	public static void startTest(final SplashScreenActivity activity)
	{
		final String[] items = activity.getResources().getStringArray(R.array.gateway);
		
		new AlertDialog.Builder(activity)
			.setTitle("테스트 IP(HOST)선택")
			.setCancelable(false)
			.setItems(items, new DialogInterface.OnClickListener()
			{
				@Override
				public void onClick(DialogInterface dialog, int which)
				{
					BaseApplication.setGateway(items[which]);
					Launcher.startClient(activity);
					dialog.dismiss();
				}
			})
			.setPositiveButton("그냥 종료", new DialogInterface.OnClickListener()
			{
				
				@Override
				public void onClick(DialogInterface dialog, int which)
				{
					activity.finish();
				}
			})
			.show();
	}
	
	/**
	 * 반영구적 어플리케이션 데이터를 보관하기 위한 SharedPreference 객체를 반환
	 * 
	 * @return SharedUtil 객체
	 */
	protected static SharedUtil getSharedPreference()
	{
		return SharedUtil.getInstance();
	}
}
